package network.tpb;

import itdb1.commun.NetworkSignal;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;

import network.AbstractUserSignal;

/**
 * Classe correspond à un signal utilisateur du groupe TPA2.
 *
 */
public class UserSignalB extends AbstractUserSignal {
	
	private NetworkSignal signal = null ;

	/**
	 * Create a new UserSignal corresponding to the packet. The UserSignal
	 * contain information about the signal and the host that sent it.
	 * 
	 * @param packet
	 */
	public UserSignalB (DatagramPacket packet) {
		super (packet) ;
		
		this.signal = deserialize(packet.getData(), packet.getLength()) ;
	}
	
	/**
	 * Create a new UserSignal corresponding to specified signal and receiver address.
	 * 
	 * @param signal
	 * @param receiver
	 */
	public UserSignalB (NetworkSignal signal, InetAddress receiver) {
		super (receiver) ;
		this.signal = signal ;
	}

	public NetworkSignal getSignal () {
		return this.signal ;
	}
	
	
	/**
	 * Transformes un tableau d'octets en un signal.
	 * 
	 * @param bytes Le tableau d'octet
	 * @param length Le nombre d'octet à utiliser
	 * @return Le signal trouvé, null si une erreur est survenue
	 */
	private static NetworkSignal deserialize (byte[] bytes, int length) {
		NetworkSignal res = null ;
		try {
			ObjectInputStream ob = new ObjectInputStream(new ByteArrayInputStream(bytes, 0, length));
			res = (NetworkSignal)ob.readObject() ;
		}
		catch (IOException e) {

		} 
		catch (ClassNotFoundException e) {

		}
		return res ;
	}
	
	/**
	 * Transforme l'objet signal en un tableau d'octet.
	 * 
	 * @return Un tableau d'octet correspondant à l'objet, null si une erreur est survenue
	 */
	@Override
	public byte[] serialize () {
		ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(bos);
			oos.writeObject(this.signal) ;
		} 
		catch (IOException e) {
			e.printStackTrace();
			return null ;
		}
		return bos.toByteArray() ;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString () {
		return this.getClass() + " (" + this.signal.getClass() + ")" ;
	}

}
